<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /*
      因为卖出股票后第二天无法交易，股票问题定义状态
      dp[i][1]表示第i天持有股票，且当天买入的最大价值
      dp[i][2]表示第i天持有股票，且当天未买入的最大价值
      dp[i][3]表示第i天不持有股票，且当天卖出的最大价值
      dp[i][4]表示第i天不持有股票，且当天未卖出的最大价值

      ②状态转移方程
      //当天买入的前提是前一天不能有股票，且前一天不能交易
      dp[i][1]=dp[i-1][4]-prices[i-1]
      //当天未买入，比较前一天不买入的最大价值和买入的最大价值
      dp[i][2]=Math.max(dp[i-1][2],dp[i-1][1])
      //当天不持有股票的最大价值，且当天卖出，因此前一天必须持有股票
      dp[i][3]=Math.max(dp[i-1][1]+prices[i-1],dp[i-1][2]+prices[i])
      //前一天也没不持有也没卖出
      dp[i][4]=Math.max(dp[i-1][4],dp[i-1][3])


      */
      var maxProfit = function (prices) {
        let dp = new Array(prices.length + 1).fill().map(() => new Array(5).fill(0))
        dp[0][1] = -prices[0]
        dp[0][2] = -prices[0]
        for (let i = 1; i <= prices.length; i++) {
          dp[i][1] = dp[i - 1][4] - prices[i - 1]
          dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1])
          dp[i][3] = Math.max(dp[i - 1][1] + prices[i - 1], dp[i - 1][2] + prices[i - 1])
          dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3])
        }
        return Math.max(dp[prices.length][3], dp[prices.length][4])
      }
      maxProfit([1, 2, 3, 0, 2])
    </script>
  </body>
</html>
